<?php

class Application_Form_CriarJogo extends Zend_Form
{

    private $_campeonato;
    private $_valorCampeonato;
    private $_timeA;
    private $_timeB;
    private $_data;
    private $_hora;
    private $_botaoCriar;
    private $_timeMapper;
    private $_campeonatoMapper;

    public function __construct (Application_Model_TimeMapper $times,
                                 Application_Model_CampeonatoMapper $campeonatos,
                                 $post = null,
                                 $options = null)
    {

        $this->_timeMapper = $times;
        $this->_campeonatoMapper = $campeonatos;

        parent::__construct($options);

        if (isset($post) && is_array($post))
        {
            //o unico jeito que eu encontrei de fazer ele carregar os valores
            //da requisicao. GAMBIARRA MODE ON
            //$this->isValid($post);
            $this->prepararCamposExtras($post);
        }
    }

    public function init ()
    {
        $this->setMethod('post');
        $this->adicionaCampeonato();

        $this->setDecorators(array(
            'FormElements',
            array('Description', array('placement' => 'prepend')),
            'Form'
        ));
    }

    private function adicionaCampeonato()
    {

        if (isset($this->_campeonato)) {
            return;
        }

        $this->_campeonato = new Zend_Form_Element_Select('s_campeonato', array(
            'onChange' => 'submit()',
        ));

        $this->_campeonato->setLabel('Campeonato')
                           ->addMultioption(null, '');

        foreach ($this->_campeonatoMapper->fetchAll() as $camp) {
            $nome = $camp->getNome();
            $this->_campeonato->addMultiOption($nome, $nome);
        }

        $this->addElement($this->_campeonato);

    }

    private function adicionaTimes()
    {

        if (!isset($this->_timeA)) {

            $this->_timeA = new Zend_Form_Element_Select('timeA');

            $this->_timeA->setLabel('Time A');

            $this->addElement($this->_timeA);
        }

        if (!isset($this->_timeB)) {

            $this->_timeB = new Zend_Form_Element_Select('timeB');

            $this->_timeB->setLabel('Time B');

            $this->addElement($this->_timeB);
        }

    }

    private function adicionaDataHora()
    {
        if (!isset($this->_data)) {
            $this->_data = new Zend_Form_Element_Text('data');

            $agora = new Zend_Date();
            $this->_data
                        ->setLabel("Data do jogo:")
                        ->addFilter(new Zend_Filter_StringTrim())
                        ->addValidator(new Zend_Validate_Date(array('format' => 'dd-MM-yyyy')))
                        ->addValidator(new Zend_Validate_StringLength(
                                array('min' => 8, 'max' => 10)))
                        ;

            $this->_hora = new Zend_Form_Element('hora');
            $this->_hora
                        ->setLabel("Hora do jogo:")
                        ->addValidator(new Zend_Validate_Date(array('format' => 'HH:mm')))
                        ->addValidator(new Zend_Validate_StringLength(array(4,5)))
                        ;

            $this->addElement($this->_data);
            $this->addElement($this->_hora);

        }
    }

    private function adicionaBotaoCriar ()
    {
        $this->_botaoCriar = new Zend_Form_Element_Submit('criar_jogo');

        $this->_botaoCriar->setLabel('Cadastrar Jogo')
                          ->setIgnore(true);
        $this->addElement($this->_botaoCriar);

    }

    private function travarCampeonato ()
    {
        $this->_campeonato->setAttrib('disabled', 'disabled');
        $this->_valorCampeonato = new Zend_Form_Element_Hidden('campeonato');
        $this->_valorCampeonato->setValue($this->_campeonato->getvalue());
        $this->addElement($this->_valorCampeonato);
    }

    private function populaTimes ()
    {
        //$this->_timeB
        $this->_timeA->clearMultiOptions();
        $this->_timeB->clearMultiOptions();

        foreach ($this->_timeMapper->localizarPeloCampeonato($this->getValue('campeonato')) as $time) {
            $nome = $time->getNome();
            $this->_timeA->addMultiOption($nome, $nome);
            $this->_timeB->addMultiOption($nome, $nome);
        }

        $this->_timeA->setValue($this->getValue('timeA'));
        $this->_timeB->setValue($this->getValue('timeB'));
    }

    private function populaData ()
    {
        $agora = new Zend_Date();

        $this->_data->setValue($agora->toString('dd-MM-yyyy'));
        $this->_hora->setValue($agora->toString('HH:mm'));
    }

    private function prepararCamposExtras ($post)
    {

        if (null != $post) {
            $this->populate($post);
        }
        $this->travarCampeonato();
        $this->adicionaTimes();
        $this->adicionaDataHora();
        $this->adicionaBotaoCriar();
        
        
        if (null != $post) {
            $this->populate($post);
        } else {
            $this->populaData();
        }

        $this->populaTimes();

        if (count ($post) > 1) {
            $this->_data->setRequired();
            $this->_hora->setRequired();
        }

        //$this->reset();
        
    }

    public function isValid ($post)
    {

        $dadosValidos = parent::isValid($post);

        if ($dadosValidos && count($post) < 2) {
            $this->prepararCamposExtras(null);
            return false;
        } else  {
            $this->_campeonato->setValue($this->getValue('campeonato'));
        }


        return $dadosValidos;
    }


}

